package org.JWCB.system.service.question.impl;

import cn.hutool.core.collection.CollectionUtil;
import org.JWCB.common.core.constants.CacheConstants;
import org.JWCB.common.core.constants.QuestionTagFieldName;
import org.JWCB.common.core.enums.QuestionTagEnums;
import org.JWCB.common.redis.service.RedisService;
import org.JWCB.system.domain.question.entity.QuestionTag;
import org.JWCB.system.domain.question.vo.QuestionTagVo;
import org.JWCB.system.mapper.question.QuestionTagMapper;
import org.JWCB.system.service.question.IQuestionTagService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

@Service
public class QuestionTagServiceImpl implements IQuestionTagService {


    @Autowired
    private QuestionTagMapper questionTagMapper;

    @Autowired
    private RedisService redisService;
    @Override
    public void setQuestionTag(Long questionId, List<Integer> questionTagIds) {
        if(CollectionUtil.isEmpty(questionTagIds)) {
            return;
        }
        QuestionTag questionTag = questionTagMapper.selectById(questionId);
        if(questionTag == null) {
            questionTag = new QuestionTag();
            questionTag.setQuestionId(questionId);
            for (Integer questionTagId : questionTagIds) {
                setSingleTag(questionTagId, questionTag);
            }
            questionTagMapper.insert(questionTag);
        }else {
            for (Integer questionTagId : questionTagIds) {
                setSingleTag(questionTagId, questionTag);
            }
            questionTagMapper.updateById(questionTag);
        }
        // 删除缓存
        redisService.deleteObject(CacheConstants.QUESTION_TAG_CACHE_LIST_LEY + questionId);
    }

    @Override
    public List<QuestionTagVo> getAllQuestionTags() {
        Collection<QuestionTagEnums> values = QuestionTagEnums.CODE_TO_ENUM_MAP.values();
        List<QuestionTagVo> questionTagVos = new ArrayList<QuestionTagVo>();
        for (QuestionTagEnums value : values) {
            QuestionTagVo questionTagVo = new QuestionTagVo();
            questionTagVo.setCode(value.getCode());
            questionTagVo.setDesc(value.getDesc());
            questionTagVos.add(questionTagVo);
        }
        return questionTagVos;
    }


    /**
     * 实体类里面设置某个标签
     * @param questionTag
     */
    private  void setSingleTag(Integer questionTagId, QuestionTag questionTag) {
        QuestionTagEnums questionTagEnums = QuestionTagEnums.getByCode(questionTagId);
        if(QuestionTagFieldName.TAG_INFO_01.equals(questionTagEnums.getFieldName())) {
            questionTag.setTagInfo01(questionTag.getTagInfo01() | questionTagEnums.getTag());
        }else if(QuestionTagFieldName.TAG_INFO_02.equals(questionTagEnums.getFieldName())) {
            questionTag.setTagInfo02(questionTag.getTagInfo02() | questionTagEnums.getTag());
        }else if(QuestionTagFieldName.TAG_INFO_03.equals(questionTagEnums.getFieldName())) {
            questionTag.setTagInfo03(questionTag.getTagInfo03() | questionTagEnums.getTag());
        }else if(QuestionTagFieldName.TAG_INFO_04.equals(questionTagEnums.getFieldName())) {
            questionTag.setTagInfo04(questionTag.getTagInfo04() | questionTagEnums.getTag());
        }
    }


    /**
     * 获取到某个题目当前的所有标签
     * @param questionId
     * @return
     */
    public List<QuestionTagVo> getQuestionAllTag(Long questionId) {
        List<QuestionTagVo> questionTagVos = new ArrayList<>();
        QuestionTag questionTag = questionTagMapper.selectById(questionId);
        if(questionTag == null) {
            return questionTagVos;
        }
        QuestionTagEnums[] values = QuestionTagEnums.values();
        for (QuestionTagEnums value : values) {
            if(containsTag(questionTag,value)) {
                QuestionTagVo questionTagVo = new QuestionTagVo();
                questionTagVo.setCode(value.getCode());
                questionTagVo.setDesc(value.getDesc());
                questionTagVos.add(questionTagVo);
            }
        }
        return questionTagVos;
    }


    private boolean containsTag(QuestionTag questionTag,QuestionTagEnums questionTagEnum) {
        if(questionTagEnum.getFieldName().equals(QuestionTagFieldName.TAG_INFO_01)) {
            return (questionTag.getTagInfo01() & questionTagEnum.getTag()) == questionTagEnum.getTag();
        }else if(questionTagEnum.getFieldName().equals(QuestionTagFieldName.TAG_INFO_02)) {
            return (questionTag.getTagInfo02() & questionTagEnum.getTag()) == questionTagEnum.getTag();
        }else if(questionTagEnum.getFieldName().equals(QuestionTagFieldName.TAG_INFO_03)) {
            return (questionTag.getTagInfo03() & questionTagEnum.getTag()) == questionTagEnum.getTag();
        }else if(questionTagEnum.getFieldName().equals(QuestionTagFieldName.TAG_INFO_04)) {
            return (questionTag.getTagInfo04() & questionTagEnum.getTag()) == questionTagEnum.getTag();
        }
        return false;
    }
}
